
' Het Werknemer programma beheert een database met informatie over de werknemers van een bedrijf. 
' Het programma onderhoudt twee files op disk of diskette: WERKNMER.DAT, de database zelf (een random-access file), 
' en WERKNMER.NDX, een index van de database (een sequentile file).
' Het Werknemer programma is geschreven voor QuickBASIC 4.0 en 4.5.

'---- Definities en declaraties.

CONST false% = 0, true% = NOT false%
CONST tabPos% = 25

TYPE werknType
     achterNaam AS STRING * 16
     voorNaam AS STRING * 10
     zkfNummer AS STRING * 11
     beginDatum AS STRING * 10
     afdeling AS STRING * 15
     functie AS STRING * 15
     salaris AS SINGLE
     salType AS STRING * 1
     vertrekDatum AS STRING * 10
END TYPE

TYPE indexType
     werknNummer AS INTEGER
     werknNaam AS STRING * 26
END TYPE

DECLARE FUNCTION LeesSalaris! ()
DECLARE FUNCTION LeesSalType$ ()
DECLARE FUNCTION Menu% (opties$())
DECLARE FUNCTION WisSpatie$ (invoer$)
DECLARE FUNCTION Zoek% (welkeTekst$)
DECLARE FUNCTION JaNee% (prompt$)
DECLARE SUB Toevoegen ()
DECLARE SUB Wijzigen ()
DECLARE SUB CloseFiles ()
DECLARE SUB Vertrek ()
DECLARE SUB DisplayMenu (optieLijst$(), coordLinks%, prompt$, ok$)
DECLARE SUB DisplayRec (toonRecord AS werknType, nummer%)
DECLARE SUB Frame (links%, rechts%, boven%, onder%)
DECLARE SUB LeesNaam (werknRecord AS werknType, RecNr%, doel$)
DECLARE SUB OpenFile ()
DECLARE SUB OpenIndex ()
DECLARE SUB Pauze ()
DECLARE SUB PrintRecords ()
DECLARE SUB NieuweIndex (werknNaam$)
DECLARE SUB Sorteren ()

DIM werknRec AS werknType, werknMenu$(6)

COMMON SHARED totWerkns%, index() AS indexType

DATA Display record
DATA Toevoegen record
DATA Wijzigen record
DATA Registratie van vertrek
DATA Printen van records
DATA Einde


'---- Hoofdprogramma.

  CLS
  LOCATE , , 1
  FOR i% = 1 TO 6
    READ werknMenu$(i%)
  NEXT i%

  OpenFile

  '---- Geef het hoofdmenu op het scherm weer en roep het subprogramma
  '     aan dat de menukeuze uitvoert.

  finito% = false%
  DO
    LOCATE 2, 32: PRINT "Werknemer-records"
    SELECT CASE Menu%(werknMenu$())
    CASE 1
      IF totWerkns% <> 0 THEN
        DisplayRec werknRec, dummy%
        Pauze
      END IF
    CASE 2
      Toevoegen
    CASE 3
      IF totWerkns% <> 0 THEN Wijzigen
    CASE 4
      IF totWerkns% <> 0 THEN Vertrek
    CASE 5
      IF totWerkns% <> 0 THEN PrintRecords
    CASE ELSE
      CloseFiles
      finito% = true%
    END SELECT
  LOOP UNTIL finito

END


SUB CloseFiles STATIC

' Het CloseFiles subprogramma sluit de database en
' slaat de bijgewerkte index in de WERKNMER.NDX file op.
  
  CLOSE #1
  IF totWerkns% > 0 THEN
    OPEN "WERKNMER.NDX" FOR OUTPUT AS #1
    FOR i% = 1 TO totWerkns%
      WRITE #1, index(i%).werknNummer, RTRIM$(index(i%).werknNaam)
    NEXT i%
    CLOSE #1
  END IF

END SUB
	

SUB DisplayMenu (optieLijst$(), coordLinks%, prompt$, ok$)
	
' Het DisplayMenu subprogramma geeft de menuopties op het scherm
' weer en zet de prompt- en de controlestring op.
' Deze routine wordt vanuit de Menu% functie aangeroepen.

' ---- Bepaal de aantal opties (aantalOpties%);
'      initialiseer de variabelen.

  aantalOpties% = UBOUND(optieLijst$)
  prompt$ = " "
  ok$ = ""
  langsteOptie% = 0

' ---- Zet de promptstring (prompt$) en de string met de geldige
'      invoerkarakters (ok$) op. Bereken tevens de lengte van
'      de langste optiestring (langsteOptie%).

  FOR i% = 1 TO aantalOpties%
    eerste$ = UCASE$(LEFT$(optieLijst$(i%), 1))
    ok$ = ok$ + eerste$
    prompt$ = prompt$ + eerste$ + "  "
    tijdelijkLangste% = LEN(optieLijst$(i%))		
    IF tijdelijkLangste% > langsteOptie% THEN 		
      langsteOptie% = tijdelijkLangste%		 
    END IF
  NEXT i%

  langsteOptie% = langsteOptie% + 1
  prompt$ = prompt$ + "-> "

' ---- Controleer of de promptstring langer is dan langsteOptie%.

  IF LEN(prompt$) >= langsteOptie% THEN langsteOptie% = LEN(prompt$) + 1

' ---- Bepaal de afmetingen van het menukader aan de hand van 
'      langsteOptie% en aantalOpties%.
'      Roep het Frame subprogramma aan om het kader te tekenen.

  coordLinks% = 37  langsteOptie% \ 2	
  coordRechts% = 80  coordLinks%
  coordBoven% = 3
  coordOnder% = 10 + aantalOpties%
  Frame coordLinks%, coordRechts%, coordBoven%, coordOnder%

' ---- Geef de menuopties weer. Elke optie begint
'      met een hoofdletter gevolgd door een haakje.

  FOR i% = 1 TO aantalOpties%
    LOCATE 6 + i%, coordLinks% + 3
    PRINT UCASE$(LEFT$(optieLijst$(i%), 1)) + ")" + MID$(optieLijst$(i%), 2)	 	
  NEXT i%

  LOCATE 4, 38: PRINT "Menu"
  regel$ = STRING$(langsteOptie%, 196)
  LOCATE 5, coordLinks% + 3: PRINT regel$
  LOCATE 7 + aantalOpties%, coordLinks% + 3: PRINT regel$

' ---- Genereer de inputprompt.

  LOCATE 9 + aantalOpties%, coordLinks% + 3: PRINT prompt$;

END SUB
			

SUB DisplayRec (toonRecord AS werknType, nummer%) STATIC

' Het DisplayRec subprogramma geeft een specifiek werknemerrecord
' op het scherm weer.

  PRINT : PRINT : PRINT : PRINT
  PRINT TAB(tabPos%); "Voer de naam van de werknemer in:"
  PRINT TAB(tabPos%); "---- -- ---- --- -- --------- --"
  LeesNaam toonRecord, nummer%, doelNaam$
  IF nummer% = 0 THEN		
    PRINT
    PRINT TAB(tabPos%); "Deze naam komt niet in de werknemer-file voor."
  ELSE
    CLS
    GET #1, nummer%, toonRecord
    PRINT : PRINT : PRINT
    PRINT : PRINT : PRINT
    PRINT TAB(tabPos%); "Naam      :   ";
    PRINT RTRIM$(toonRecord.voorNaam); " "; toonRecord.achterNaam
    PRINT TAB(tabPos%); "Zkfnummer :   "; toonRecord.zkfNummer
    PRINT TAB(tabPos%); "Begindatum:   "; toonRecord.beginDatum
    IF LEFT$(toonRecord.afdeling, 10) <> "VERTROKKEN" THEN
      PRINT TAB(tabPos%); "Afdeling  :   "; toonRecord.afdeling
    END IF
    PRINT TAB(tabPos%); "Functie   :   "; toonRecord.functie
    PRINT TAB(tabPos%); "Salaris   :   ";

    SELECT CASE toonRecord.salType
      CASE "U"
	PRINT USING "**###.## per uur"; toonRecord.salaris                 		
      CASE "M"		
        PRINT USING "**#,#### per maand"; toonRecord.salaris
      CASE ELSE
	PRINT USING "**#,##### per jaar"; toonRecord.salaris
    END SELECT

'   ---- Indien de werknemer niet meer bij de firma werkt,
'        laat dit dan uit de recordweergave blijken.

    IF LEFT$(toonRecord.afdeling, 10) = "VERTROKKEN" THEN		
      PRINT: PRINT TAB(tabPos%); "*** Niet meer in dienst ***":	PRINT
      PRINT TAB(tabPos%); "Vertrekdatum:   "; toonRecord.vertrekDatum	
    END IF
  END IF

END SUB	


SUB Frame (links%, rechts%, boven%, onder%) STATIC

' Het Frame subprogramma tekent een rechthoekig kader met dubbele
' lijnen op het scherm door middel van grafische karakters
' uit de IBM Extended Character Set.

' ---- Teken de vier hoeken.

  LOCATE boven%, links%: PRINT CHR$(201)
  LOCATE boven%, rechts%: PRINT CHR$(187)
  LOCATE onder%, links%: PRINT CHR$(200);
  LOCATE onder%, rechts%: PRINT CHR$(188);

' ---- Teken de verticale lijnen.

  FOR vert% = boven% + 1 TO onder% - 1
    LOCATE vert%, links%: PRINT CHR$(186);
    LOCATE vert%, rechts%: PRINT CHR$(186);
  NEXT vert%

' ---- Teken de horizontale lijnen.

  horiz% = rechts% - links% - 1
  hlijn$ = STRING$(horiz%, 205)
  LOCATE boven%, links% + 1: PRINT hlijn$
  LOCATE onder%, links% + 1: PRINT hlijn$;

END SUB


FUNCTION JaNee% (prompt$)

' De JaNee% functie stelt een ja-of-nee vraag en retourneert
' een logische waarde die het antwoord van de gebruiker vertegenwoordigt:
' true betekent ja en false is nee.

' ---- Geef de vraag weer en initialiseer de variabelen.

  PRINT prompt$; " (J of N) -> ";
  ant$ = ""
  karPos% = 0

'  ---- Lees het antwoord.

  DO
    LOCATE , , 1
    ant$ = UCASE$(INKEY$)
    IF ant$ <> "" THEN
      karPos% = INSTR("JN", ant$)
      IF karPos% = 0 THEN BEEP
      END IF
  LOOP UNTIL karPos% > 0
  PRINT ant$

' ---- Zet het antwoord in een logische waarde om.

  JaNee% = (ant$ = "J")

END FUNCTION


SUB LeesNaam (werknRecord AS werknType, RecNr%, doel$) STATIC

' Het LeesNaam subprogramma accepteert de werknemernaam die
' het programma vervolgens in de database opzoekt.
' LeesNaam retourneert twee scalaire waarden aan de aanroepende
' procedure: RecNr% is het recordnummer (of 0 indien het
' record niet aanwezig is), en doel$ is de geindexeerde
' werknemernaam. Bovendien retourneert LeesNaam een werknRecord structuur
' met de voornaam- en achternaamelementen die de gebruiker heeft ingevoerd.

  PRINT : PRINT
  PRINT TAB(tabPos%); : INPUT "Achternaam    --> ", tijdelijkAchternm$
  PRINT TAB(tabPos%); : INPUT "Voornaam      --> ", tijdelijkVoornm$
  doel$ = UCASE$(WisSpatie$(tijdelijkAchternm$ + tijdelijkVoornm$))
  IF totWerkns% <> 0 THEN
    RecNr% = Zoek$(doel$)
  END IF
  werknRecord.achterNaam = tijdelijkAchternm$
  werknRecord.voorNaam = tijdelijkVoornm$

END SUB


FUNCTION LeesSalaris!

' De LeesSalaris! functie leest een numerieke invoerwaarde voor
' het salaris van een werknemer. LeesSalaris! slaat deze waarde
' in eerste instantie in een stringvariabele op en accepteert
' de waarde alleen indien deze in een nonzero getal kan worden geconverteerd.
  
  posX% = POS(0)
  posY% = CSRLIN
  DO
    INPUT "Salaris       --> ", sal$
    sal = VAL(sal$)
    IF sal = 0 THEN
      LOCATE posY%, posX%
      PRINT SPACE$(LEN(sal$) + 16)
      LOCATE posY%, posX%
    END IF
  LOOP UNTIL sal > 0
  LeesSalaris! = sal

END FUNCTION
  

FUNCTION LeesSalType$

' De LeesSalType$ functie accepteert een enkel karakter
' dat aangeeft of het salaris van een werknemer op uur- (U),
' maand- (M), of op jaarbasis (J) wordt berekend. De functie
' negeert ongeldige invoerkarakters.

  DO
    LOCATE , , 1
    salarisType$ = UCASE$(INKEY$)
    IF INSTR("UMJ", salarisType$) = 0 THEN
      BEEP
      salarisType$ = ""
    END IF
  LOOP UNTIL LEN(salarisType$) > 0
  PRINT salarisType$
  LeesSalType$ = salarisType$

END FUNCTION


FUNCTION Menu% (opties$()) STATIC

' De Menu% functie geeft een menu op het scherm weer en
' verwerkt de menukeuze van de gebruiker. Menu% ontvangt
' stringarray opties$ met de menuopties en
' retourneert een integer getal dat de keuze van
' de gebruiker vertegenwoordigt.

  menuLengte% = UBOUND(opties$)
  DisplayMenu opties$(), margeLinks%, promptStr$, okStr$

' ---- Lees de menukeuze en controleer deze.

  besturingsToetsen$ = CHR$(13) + CHR$(27)
  DO
    LOCATE , , 1
    karPos% = 0
    DO
      antwoord$ = UCASE$(INKEY$)
      IF antwoord$ <> "" THEN karPos% = INSTR(okStr$, antwoord$)
      IF karPos% = 0 THEN BEEP
    LOOP UNTIL karPos% > 0
    PRINT antwoord$
    LOCATE 11 + menuLengte%, 23, 0
    PRINT "<Enter> voor bevestiging; <Esc> voor opnieuw."
    keuze% = karPos%
    karPos% = 0
    DO
      antwoord$ = INKEY$
      IF antwoord$ <> "" THEN karPos% = INSTR(besturingsToetsen$, antwoord$)
      IF karPos% = 0 THEN BEEP
    LOOP UNTIL karPos% > 0
    IF karPos% = 1 THEN
      finito% = true% : CLS
    ELSE
      finito% = false%
      LOCATE 11 + menuLengte%, 23: PRINT SPACE$(35)
      LOCATE 9 + menuLengte%, margeLinks% + 3 + LEN(promptStr$)
      PRINT " ";
      LOCATE , POS(0)  1:
    END IF
  LOOP UNTIL finito%

  Menu% = keuze%

END FUNCTION


SUB NieuweIndex (werknNaam$) STATIC

' Het NieuweIndex subprogramma zet een nieuwe index op zodra
' een nieuwe werknemer aan de database is toegevoegd.

' ---- Kopieer de actieve index eerst naar een tijdelijke index-array.

  IF totWerkns% > 1 THEN		
    oudTot% = totWerkns% - 1
    REDIM tijdelijkeIndex(oudTot%) AS indexType
    FOR i% = 1 TO oudTot%
      tijdelijkeIndex(i%) = index(i%)
    NEXT i%
  END IF

' ---- Dimensioneer de index() array tot het vereiste formaat.
'      (Dit proces wist tevens alle data uit de array, hetgeen de reden
'      is dat het programma eerst een tijdelijke kopie van de index moet maken.)

  REDIM index(totWerkns%) AS indexType

' ---- Kopieer de indexinhoud tenslotte weer naar de index() array
'      en sla de nieuwe invoer aan het einde van de index op.

  IF totWerkns% > 1 THEN
    FOR i% = 1 TO oudTot%
      index(i%) = tijdelijkeIndex(i%)
    NEXT i%
  END IF

  index(totWerkns%).werknNummer = totWerkns%
  index(totWerkns%).werknNaam = werknNaam$

' ---- Sorteer de nieuwe index.

  Sorteren

END SUB


SUB OpenFile STATIC

' Het OpenFile subprogramma opent de feitelijke databasefile
' en definieert de veldvariabelen. Deze variabelen zijn reeds aan
' het begin van het programma als globaal gedeclareerd in
' het COMMON SHARED statement.

  DIM openRecord AS werknType
  OPEN "WERKNMER.DAT" FOR RANDOM AS #1 LEN = LEN(openRecord)

' ---- Bereken de aantal records in de database door middel van de LOF functie.

  totWerkns% = LOF(1) / LEN(openRecord)

' ---- Open vervolgens de indexfile op voorwaarde dat de database niet leeg is.

  IF totWerkns% <> 0 THEN OpenIndex

END SUB


SUB OpenIndex STATIC

' Het OpenIndex subprogramma opent de indexfile, WERKNMER.NDX,
' en leest de inhoud van de file in de index() array.
' Recordvariabelen werknNummer en werknNaam bevatten respectievelijk
' de werknemer recordnummers en de werknemernamen.

' ---- Aangezien het formaat van de index verandert zodra
'      een nieuwe werknemer aan de file wordt toegevoegd,
'      wordt de dimensie van de index() array
'      door middel van het REDIM statement bepaald.

  REDIM index(totWerkns%) AS indexType
  OPEN "WERKNMER.NDX" FOR INPUT AS #2
  FOR i% = 1 TO totWerkns%
    INPUT #2, index(i%).werknNummer, index(i%).werknNaam
  NEXT i%

' ---- De index blijft tot het einde van de programma-executie
'      in het geheugen aanwezig. Sluit de indexfile dus voorlopig.

  CLOSE #2

END SUB
  

SUB Pauze STATIC

' Het Pauze subprogramma onderbreekt de programma-executie tijdelijk,
' zodat de gebruiker een volgeschreven scherm rustig kan bestuderen.
' De gebruiker drukt gewoon de spatiebalk in om door te gaan.

  LOCATE 25, 45, 1
  PRINT "Druk op spatiebalk voor doorgaan.";
  DO
    ka$ = INKEY$
  LOOP UNTIL ka$ = " "
  CLS

END SUB


SUB PrintRecords STATIC

' Het PrintRecords subprogramma drukt een lijst met werknemers af.
' Het subprogramma biedt de gebruiker de mogelijkheid om vertrokken
' werknemers al dan niet in de printout op te nemen.

  DIM printRecord AS werknType
  PRINT : PRINT : PRINT
  PRINT TAB(tabPos%); "Worden vertrokken werknemers"
  PRINT TAB(tabPos%); "in de printout "
  prompt$ = "opgenomen?"
  PRINT TAB(tabPos%);
  vertrokken% = JaNee%(prompt$)
  PRINT
  PRINT TAB(tabPos%); "Druk de spatiebalk in "
  PRINT TAB(tabPos%); "wanneer de printer operationeel is. ";
  DO
    pr$ = INKEY$
  LOOP UNTIL pr$ = " "
  LPRINT "   Achternaam        Voornaam      ZkfNr.  Functie";
  LPRINT "         Salaris"
  LPRINT "   ----------        --------      ------  -------";
  LPRINT "         -------"
  LPRINT
  FOR i% = 1 TO totWerkns%
    GET #1, index(i%).werknNummer, printRecord
    weg% = (LEFT$(printRecord.afdeling, 10) = "VERTROKKEN")
    IF weg% IMP vertrokken% THEN
      IF weg% THEN
	LPRINT "** ";
      ELSE
	LPRINT "   ";
      END IF
      LPRINT printRecord.achterNaam; " "; printRecord.voorNaam; " ";
      LPRINT printRecord.zkfNummer; " "; printRecord.functie;
      IF printRecord.salType = "U" THEN
        LPRINT USING " **###.## /uur"; printRecord.salaris
      ELSEIF printRecord.salType = "M" THEN
        LPRINT USING " **#,#### /ma"; printRecord.salaris
      ELSE
        LPRINT USING " **#,##### /ja"; printRecord.salaris
      END IF
    END IF
  NEXT i%
  IF vertrokken% THEN
    LPRINT : LPRINT : LPRINT
    LPRINT "** Vertrokken werknemer."
  END IF
  Pauze

END SUB


SUB Sorteren STATIC

' Het Sorteren subprogramma sorteert de index() array met
' het werknNaam element van de index() recordstructuur als
' de sorteersleutel.
' Dit subprogramma is gebaseerd op het Shell sorteeralgoritme.

  lengte% = totWerkns%
  stap% = 1
  DO WHILE stap% <= lengte%
    stap% = stap% * 2
  LOOP
  DO WHILE stap% > 1
    stap% = (stap% - 1) \ 2
    DO
      voltooid% = true%
      FOR hoger% = 1 TO lengte% - stap%
	lager% = hoger% + stap%
	IF index(hoger%).werknNaam > index(lager%).werknNaam THEN
    	  SWAP index(hoger%), index(lager%)
	  voltooid% = false%
	END IF
      NEXT hoger%
    LOOP UNTIL voltooid%
  LOOP

END SUB


SUB Toevoegen STATIC

' Het Toevoegen subprogramma assisteert de gebruiker bij
' het toevoegen van een nieuwe werknemer aan de database.

  DIM toevoegenRecord AS werknType
  PRINT : PRINT : PRINT : PRINT
  PRINT TAB(tabPos%); "Voer de gegevens voor de nieuwe werknemer in"
  PRINT TAB(tabPos%); "---- -- -------- ---- -- ------ --------- --"

' ---- LeesNaam verwerkt de naam van de werknemer.

  LeesNaam toevoegenRecord, inFile%, nieuweNaam$

' ---- Duplicaten van namen zijn niet toegestaan.

  IF inFile% THEN
    PRINT: PRINT TAB(tabPos%); "Deze naam komt reeds in de file voor."
  ELSE

' ---- Verwerk de overige gegevens voor de nieuwe werknemer.

    PRINT TAB(tabPos%);
    INPUT "ZkfNummer    --> ", toevoegenRecord.zkfNummer
    PRINT TAB(tabPos%);
    INPUT "Afdeling     --> ", toevoegenRecord.afdeling
    PRINT TAB(tabPos%);
    INPUT "Functie      --> ", toevoegenRecord.functie
    PRINT TAB(tabPos%);
    toevoegenRecord.salaris = LeesSalaris!
    PRINT TAB(tabPos%); "U)ur,"
    PRINT TAB(tabPos%); "M)aand, of"
    PRINT TAB(tabPos%); "J)aarbasis   --> ";
    toevoegenRecord.salType = LeesSalType$
    toevoegenRecord.beginDatum = DATE$
    PRINT: PRINT TAB(tabPos%);

' ---- De gebruiker dient de keuze te hebben om een
'      nieuw record ongedaan te maken (bijvoorbeeld indien een
'      fout is ontdekt) of naar de database te schrijven.

    IF JaNee%("Record opslaan?") THEN
      totWerkns% = totWerkns% + 1
      PUT #1, totWerkns%, toevoegenRecord
      NieuweIndex nieuweNaam$
    END IF
  END IF
  Pauze

END SUB


SUB Vertrek STATIC

' Het Vertrek subprogramma herziet een record om aan te geven dat
' de werknemer in kwestie het bedrijf heeft verlaten, en wel in
' die zin dat het woord 'VERTROKKEN' in het vertrekRecord.afdeling veld
' wordt opgeslagen en het vertrekDatum veld de vertrekdatum
' (de systeemdatum) krijgt toegewezen.

  DIM vertrekRecord AS werknType
  DisplayRec vertrekRecord, welk%
  PRINT : PRINT : PRINT TAB(tabPos%);
  IF welk% > 0 THEN
    IF LEFT$(vertrekRecord.afdeling, 10) <> "VERTROKKEN" THEN
      IF JaNee%("Is dit de vertrokken werknemer?") THEN
	vertrekRecord.afdeling = "VERTROKKEN"
	vertrekRecord.vertrekDatum = DATE$
	PRINT: PRINT TAB(tabPos%); "*** Het vertrek is geregistreerd. ***"
	PUT #1, welk%, vertrekRecord
       ELSE
 	 PRINT
	 PRINT TAB(tabPos%); "Geen verandering in status van werknemer."
       END IF	
    ELSE
       PRINT: PRINT TAB(tabPos%); "Deze werknemer was al vertrokken."
    END IF
  END IF
  Pauze

END SUB


SUB Wijzigen

' Het Wijzigen subprogramma verwerkt modificaties voor een werknemerrecord.

  DIM wijzigRecord AS werknType, wijzigMenu$(4)
  afdelingStr$ = "Afdeling ...> "
  functieStr$ = "Functie ....> "
  salStr$ = "Salaris ....> "
  wijzigMenu$(4) = "Record OK."
  PRINT : PRINT : PRINT : PRINT
  PRINT TAB(tabPos%); "Voer de naam van de werknemer in:"
  PRINT TAB(tabPos%); "---- -- ---- --- -- --------- ---"
  LeesNaam wijzigRecord, num%, dummy$
  IF num% = 0 THEN
    PRINT: PRINT TAB(tabPos%); "Deze naam komt niet in de database voor."
    Pauze
  ELSE
    CLS: GET #1, num%, wijzigRecord: wijzigOptie% = 0
    DO
      PRINT TAB(tabPos%); "Wijzigen van een werknemerrecord."
      PRINT TAB(tabPos%); "Naam:  ";
      PRINT RTRIM$(wijzigRecord.voorNaam); " "; wijzigRecord.achterNaam
      wijzigMenu$(1) = afdelingStr$ + RTRIM$(wijzigRecord.afdeling)
      wijzigMenu$(2) = functieStr$ + RTRIM$(wijzigRecord.functie)		
      SELECT CASE wijzigRecord.salType
	CASE "U"
 	  sal$ = " per uur"
	CASE "M"
 	  sal$ = " per maand"
	CASE ELSE
	  sal$ = " per jaar"
      END SELECT
      sal$ = "f" + LTRIM$(STR$(wijzigRecord.salaris)) + sal$
      wijzigMenu$(3) = salStr$ + sal$
      finito% = false%
      SELECT CASE Menu%(wijzigMenu$())
	CASE 1
 	  PRINT : PRINT : PRINT : PRINT : PRINT TAB(tabPos%);
	  INPUT "Nieuwe afdeling --> ", wijzigRecord.afdeling
	CASE 2
 	  PRINT : PRINT : PRINT : PRINT : PRINT TAB(tabPos%);
	  INPUT "Nieuwe functie --> ", wijzigRecord.functie
	CASE 3
 	  PRINT : PRINT : PRINT : PRINT : PRINT TAB(tabPos%); "Nieuw ";
	  wijzigRecord.salaris = LeesSalaris!
	  PRINT TAB(tabPos%);
	  PRINT "U)ur, M)aand, J)aarbasis --> ";
	  wijzigRecord.salType = LeesSalType$
	  Pauze
	CASE ELSE
 	  finito% = true%
	END SELECT
	CLS
    LOOP UNTIL finito%
    PUT #1, num%, wijzigRecord
  END IF

END SUB


FUNCTION WisSpatie$ (invoer$)

' De WisSpatie$ functie verwijdert alle spaties uit het ontvangen
' stringargument. WisSpatie$ wordt gebruikt om de naam entries
' voor de index op te zetten en om de velditems op het scherm weer te geven.

  invoer$ = LTRIM$(RTRIM$(invoer$))
  tijdelijk$ = ""
  FOR i% = 1 TO LEN(invoer$)
    enkelKar$ = MID$(invoer$, i%, 1)
    IF enkelKar$ <> " " THEN
      tijdelijk$ = tijdelijk$ + enkelKar$
    END IF
  NEXT i%

  WisSpatie$ = tijdelijk$

END FUNCTION
 

FUNCTION Zoek% (welkeTekst$) STATIC

' De Zoek% functie voert een binaire zoekactie uit.
' De routine zoekt naar een doelstring (welkeTekst$) in het
' werknNaam element van de index() array. Indien deze is gevonden
' retourneert Zoek% de overeenkomstige integer in het
' werknNummer element van de index() array.
' Indien de doelstring niet is gevonden retourneert Zoek% een waarde van nul.

  begin% = 1
  einde% = totWerkns%
  gevonden% = false%
  leesNr% = 0
  DO WHILE begin% <= einde% AND NOT gevonden%
    midden% = (begin% + einde%) \ 2
    indexNaam$ = RTRIM$(index(midden%).werknNaam)
    IF welkeTekst$ = indexNaam$ THEN
      gevonden% = true%
      leesNr% = index(midden%).werknNummer
    ELSEIF welkeTekst$ > indexNaam$ THEN
      begin% = midden% + 1
    ELSE
      einde% = midden% - 1
    END IF
  LOOP

  Zoek% = leesNr%

END FUNCTION

